#include <iostream>
#include <cstring>
using namespace std;

class MyString {
public:
    // 无参构造函数
    MyString();
    // 有参构造函数
    MyString(const char* str);
    // 拷贝构造函数
    MyString(const MyString& str);
    // 析构函数
    ~MyString();

    void print() const;  // 输出字符串对象的内容
    int length() const;  // 输出字符串对象的长度

    // 对两个不同的字符串对象进行字符串拼接
    MyString operator + (const MyString& str) const;
    // 赋值运算符重载
    MyString& operator = (const MyString& str);
    // 判断两个字符串是否相等
    bool operator == (const MyString& str) const;
    // 大小写转换
    MyString upper() const;
    MyString lower() const;

private:
    char* p;
    int n;
};

// 无参构造函数
MyString::MyString() {
    p = new char[1];
    p[0] = '\0';
    n = 0;
}

// 有参构造函数
MyString::MyString(const char* str) {
    if (str == NULL) {
        p = new char[1];
        p[0] = '\0';
        n = 0;
    } else {
        n = strlen(str);
        p = new char[n+1];
        strcpy(p, str);
    }
}

// 拷贝构造函数
MyString::MyString(const MyString& str) {
    n = str.n;
    p = new char[n+1];
    strcpy(p, str.p);
}

// 析构函数
MyString::~MyString() {
    delete[] p;
}

void MyString::print() const {
    cout << p << endl;
}

int MyString::length() const {
    return n;
}

// 对两个不同的字符串对象进行字符串拼接
MyString MyString::operator + (const MyString& str) const {
    MyString newStr;
    newStr.n = n + str.n;
    newStr.p = new char[newStr.n+1];
    strcpy(newStr.p, p);
    strcat(newStr.p, str.p);
    return newStr;
}

MyString& MyString::operator = (const MyString& str) {
    if (this != &str) {
        delete[] p;
        n = str.n;
        p = new char[n+1];
        strcpy(p, str.p);
    }
    return *this;
}

bool MyString::operator == (const MyString& str) const {
    return strcmp(p, str.p) == 0;
}

MyString MyString::upper() const {
    MyString newStr(*this);
    for (int i = 0; i < newStr.n; i++) {
        if (newStr.p[i] >= 'a' && newStr.p[i] <= 'z')
            newStr.p[i] -= 32;
    }
    return newStr;
}

MyString MyString::lower() const {
    MyString newStr(*this); 
    for (int i = 0; i < newStr.n; i++) {
        if (newStr.p[i] >= 'A' && newStr.p[i] <= 'Z')
            newStr.p[i] += 32;
    }
    return newStr;
}

// 测试
int main() {
    MyString a("apple");
    MyString b("banana");
    MyString c = a + b;
    a.print();  // 输出 "apple"
    b.print();  // 输出 "banana"
    c.print();  // 输出 "applebanana"
    cout << c.length() << endl;  // 输出 12

    MyString d = a;
    d.print();  // 输出 "apple"
    d = b;
    d.print();  // 输出 "banana"

    MyString e("hello");
    MyString f("world");
    if (e == f)
        cout << "e and f are equal." << endl;
    else
        cout << "e and f are not equal." << endl;

    MyString g("HELLO world");
    g = g.lower();
    g.print();  // 输出 "hello world"

    MyString h("hello WORLD");
    h = h.upper();
    h.print();  // 输出 "HELLO WORLD"

    return 0;
}